package com.cskaoyan.javase.basic._2variable._4cast;

/**
 * 数据类型转换
 * 之前我们提到过，Java是强类型语言，一个变量必须明确它的数据类型， 并且数据类型一旦确定不能随意更改。
 * 但不能随意修改并不是不能更改，而是需要一定的条件，Java中变量的数据类型由某一种转换为另一种，我们将这个过程叫做数据类型转换。
 * 我们之前提到过：声明是告诉编译器变量的数据类型，那么数据类型的转换，也同样是要告诉编译器怎么转换，转换成了什么数据类型。
 *
 * 数据类型的转换又可以分为两类(不管是基本数据类型,还有引用数据类型都是这样的)：
 *      1.自动类型转换
 *      2.强制类型转换
 * 接下来，我们以基本数据类型为例，讲一下这两种类型转换。
 * 当然，首先要明确的是：
 * 基本数据类型的数据类型转换必须在byte、short、int、long、float、double这些数值类型和char类型之间进行
 * boolean类型不参与基本数据类型的数据类型转换。(布尔类型不能做任何类型转换)
 *
 * 基本数据类型的自动类型转换:
 * 自动类型转换?谁在动?怎么个自动法呢?
 * 之所以称之为"自动",是因为程序员不需要写额外代码,完成类型转换
 * 是编译器主动帮助完成类型转换
 * 这种类型转换称之为"自动类型转换"
 *
 * 转换的条件是:
 * 把小取值范围的数据类型 --> 大取值范围的数据类型
 *
 * 注意:
 *      1.浮点数的所有类型取值范围都远大于任何整型以及char类型
 *      2.基本数据类型的自动类型转换,全程无需写额外代码,那么它是绝对安全的吗?会不会带来数据失真呢?
 *      有可能
 *      当int --> float时就会
 *      long --> float
 *      long --> double 也会
 *
 *      3.char类型作为数值类型,取值范围是[0,65535]
 *      所以char类型的自动类型转换需要从int类型开始
 *
 *
 * 基本数据类型的强制类型转换:
 * 所谓强制,指的是编译器不会自主完成类型转换,需要程序员写额外代码完成类型转换
 * 需要专门的强制类型转换的语法
 * 语法:
 *     强转后的数据类型 变量名 = (强转后的数据类型)被强转的变量;
 *
 * 转换的条件:
 * 把大取值范围的数据类型 --> 小取值范围的数据类型
 * 大转小,在很多时候都会出现数据丢失失真的情况,所以这种强转是很危险的,做强转需要慎重考虑
 * 避免出现数据失真,导致程序运行异常.
 *
 *
 *
 * @since 17:22
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // int 用 long类型来接收,这里就发生了自动类型转换
        long a = 100;

        // float 用 double类型来接收,这里就发生了自动类型转换
        double b = 0.1F;

        // double类型可以用来装哪些数据类型变量/常量呢? 可以装所有的数值类型
        double c = 100L;
        double c2 = 100;
        double c3 = 'a';


        int num = 1234567891;
        float num2 = num;
        System.out.println(num2);
        double num3 = num;
        System.out.println(num3);

        // double --> float 是大转小,是强制类型转换,需要写额外强转语法完成强转
        float f1 = (float) 0.1;

        // 日常开发中,强转比较常用在取整上
        double d1 = 100.2;
        /*
            强转的快捷键:
                1.alt+回车,根据提醒完成强转
                2.在要强转的变量后面写".cast"
                    然后写要强转的数据类型
                    这时继续写".var"
                    自动补全左边的数据类型声明
         */
        int intNum = (int) d1;
        System.out.println(intNum);

        byte b1 = (byte) 130;
        System.out.println(b1);

    }
}
